package br.com.foxinline.manager.criar.ep;

import br.com.foxinline.enums.CategoriaPessoa;
import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.*;
import br.com.foxinline.modelo.ep.AtoTipoEP;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.modelo.ep.Testamento;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.EstadoServico;
import br.com.foxinline.servico.TipoSeloServico;
import br.com.foxinline.servico.ep.AtoTipoEPServico;
import br.com.foxinline.servico.ep.TestamentoServico;
import br.com.foxinline.utilitario.AnexoUtilitario;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerCriarTestamento implements Serializable {

    @EJB
    TestamentoServico testamentoServico;
    @EJB
    AtoTipoEPServico atoTipoEPServico;    
    @EJB
    TipoSeloServico tipoSeloServico;
    @EJB
    EstadoServico estadoServico;    
    @EJB
    CidadeServico cidadeServico;
    
    private Testamento testamento;
    
    private SeloEP seloEP;    
    private List<SeloEP> selosEP;

    private List<Anexo> anexos;
    private AnexoUtilitario anexoUtilitario;

    private String editarId;

    @PostConstruct
    public void init() {
        instanciar();
        delegar();
    }

    private void instanciar() {
        this.testamento = new Testamento();
        this.testamento.setTestador(new Pessoa());

        this.seloEP = new SeloEP();
        this.selosEP = new ArrayList<SeloEP>();

        this.anexos = new ArrayList<Anexo>();
        this.anexoUtilitario = new AnexoUtilitario();
    }

    private void delegar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.editarId = parametros.get("testamentoId");        
        
        if (editarId != null) {
            this.testamento = testamentoServico.pesquisar(Long.parseLong(editarId));
            this.selosEP = testamentoServico.obterSelos(this.testamento);
            this.anexos = testamentoServico.obterAnexos(this.testamento);
        }
    }

    public void salvar() throws IOException {        
        String mensagem;

        this.testamento.getTestador().setCategoriaPessoa(CategoriaPessoa.CLIENTE);
        this.testamento.getTestador().setTipoPessoa(TipoPessoa.FISICA);

        if (this.testamento.getTestador().getCpf() != null && !this.testamento.getTestador().getCpf().isEmpty()) {
            this.testamento.getTestador().setCpf(Caracteres.removecaracter(this.testamento.getTestador().getCpf()));
        }

        anexoUtilitario.gravarAnexos(this.anexos);
        
        this.testamento.setSelosEP(this.selosEP);
        this.testamento.setAnexos(this.anexos);
        
        if (this.testamento.getId() == null) {
            testamentoServico.salvar(this.testamento);
            mensagem = "Escritura cadastrada com sucesso!";
            instanciar();
        } else {
            testamentoServico.atualizar(this.testamento);
            mensagem = "Escritura atualizada com sucesso!";
        }

        Mensagem.messagemInfo(mensagem);
    }            
    
    public void adicionarAnexo(FileUploadEvent event) {
        try {
            this.anexos.add(anexoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        } catch (SQLException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        } catch (IOException e) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, e);
        }
    }    

    public void removerAnexo(Anexo a) {
        try {
            anexoUtilitario.excluirArquivo(new File(a.getUrl() + a.getNome()));
            this.anexos.remove(a);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarEscritura.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
    
    public void adicionarSeloEP() {
        this.selosEP.add(this.seloEP);
        this.seloEP =  new SeloEP();
    }
    
    public void limparSeloEP() {
        this.seloEP =  new SeloEP();
    }
    
    public void editarSeloEP(SeloEP seloEP) {
        this.seloEP = seloEP;
        this.selosEP.remove(seloEP);
    }

    public void removerSeloEP(SeloEP seloEP) {
        this.selosEP.remove(seloEP);
    }    
    
    public List<AtoTipoEP> autocompletarAtoTipoEP(String query) {
        return atoTipoEPServico.autocompletarAtoTipoRCTO(query);
    }        
    
    public List<TipoSelo> autocompletarTipoSelo(String query) {
        return tipoSeloServico.autocompletar(query);
    }
    
    public List<Estado> autocompletarEstado(String query) {
        return estadoServico.autocompletar(query);
    }

    public List<Cidade> autocompletarCidade(String query) {
        return cidadeServico.autocompletar(query);
    }
    
    public Testamento getTestamento() {
        return testamento;
    }

    public void setTestamento(Testamento testamento) {
        this.testamento = testamento;
    }

    public SeloEP getSeloEP() {
        return seloEP;
    }

    public void setSeloEP(SeloEP seloEP) {
        this.seloEP = seloEP;
    }

    public List<SeloEP> getSelosEP() {
        return selosEP;
    }

    public void setSelosEP(List<SeloEP> selosEP) {
        this.selosEP = selosEP;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }
    
}
